﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GrupyzServices.BdAccess;
using PreBuildGrupyz.Models;


namespace PreBuildGrupyz.Controllers
{
    public class DealController : Controller
    {
        IDealRepository _Dealrepository;
        IparceiroRepository _ParceiroRepository;

        public DealController()
            : this(new DealRepository(), new ParceiroRepository())
        { }

        public DealController(DealRepository repository, ParceiroRepository parceiroRep)
        {
            _Dealrepository = repository;
            _ParceiroRepository = parceiroRep;
        }

        //
        // GET: /Deal/
        public ActionResult Detalhe(string id)
        {
            int Id = int.Parse(id.Remove(id.IndexOf("-"), id.Length-1));
            //var deal = _Dealrepository.GetDeal(Id);

            return View(_Dealrepository.GetDealDetalhe(Id));
        }

        [ChildActionOnly]
        public ActionResult SideDeal()
        {
            return PartialView("SideDeal", _Dealrepository.GetSideDeal());
        }

        [ChildActionOnly]
        public ActionResult SideDealComentario(int id)
        {
            return PartialView("SideDeal", _Dealrepository.GetSideDeal(id));
        }

        //[OutputCache(Duration = 3600, VaryByParam = "None")] 
        public ActionResult Ultimos(int? id)
        {
            return View(_Dealrepository.GetUltimos(id));
        }

        public ActionResult Favoritos(int? id)
        {
            return View(_Dealrepository.GetFavoritos(id));
        }

        public JsonResult GetVendidos(string id)
        {
            return Json(_Dealrepository.GetQtdVendida(int.Parse(id)).ToArray<QtdVendida>(), JsonRequestBehavior.AllowGet);
        }

        [HttpGet]
        public ActionResult Comprar(int id, bool Oferta = false)
        {
            var deal = _Dealrepository.GetDeal(id);

            var cart = ShoppingCart.GetCart(this.HttpContext);

            cart.AddToCart(deal, Oferta);

            ClienteRepository cli = new ClienteRepository();

            return View(new OrderDetailViewModel
            {
                IdCart = cart.GetCartId(this.HttpContext),
                DealId = id,
                Oferta = Oferta,
                Quantidade = 1,
                ListaItems = GenerateNumbers(),
                Descricao = deal.Descricao,
                Total = deal.PrecoDesconto,
                ValorUn = deal.PrecoDesconto,
                Texto = deal.Texto,
                Imagem = deal.Artigo.Imagem,
                Condicoes = _Dealrepository.GetCondicoes(id),
                Pontos = Request.IsAuthenticated ? cli.GetPontosCliente(int.Parse(HttpContext.User.Identity.Name)) : new List<int> { 0 }
            });
        }

        [HttpPost]
        public ActionResult ActualizaValor(string id, int qtd)
        {
            int Id = 0;
            int.TryParse(id, out Id);
            //var deal = _Dealrepository.GetDeal(Id);
            var cart = ShoppingCart.GetCart(this.HttpContext);
            cart.AddToCart(Id, qtd);

            return Json(new ShoppingCartAddViewModel
            {
                Message = "",
                Quantidade = qtd,
                ValorUn = cart.GetTotalByID(Id),
                CartTotal = cart.GetTotal(),
                AddId = Id
            });
        }

        [Authorize]
        [HttpPost]
        public ActionResult ActualizaPontos(string id, int pontos)
        {
            int Id = 0;
            int.TryParse(id, out Id);
            //var deal = _Dealrepository.GetDeal(Id);
            var cart = ShoppingCart.GetCart(this.HttpContext);

            decimal total = cart.GetTotal();
            ClienteRepository cli = new ClienteRepository();
            int countPontos = cli.GetPontosCliente(int.Parse(HttpContext.User.Identity.Name)).Count-1;

            if ((int)total < pontos || countPontos < pontos)
            {
                return Json(new ShoppingCartAddViewModel
                {
                    Message = "",
                    ValorUn = cart.GetTotalByID(Id),
                    CartTotal = cart.GetTotal(),
                    AddId = Id
                });
            }

            cart.AddPontosToCart(Id, pontos);

            return Json(new ShoppingCartAddViewModel
            {
                Message = "",
                Quantidade = pontos,
                ValorUn = cart.GetTotalByID(Id),
                CartTotal = cart.GetTotalPontos(),
                AddId = Id
            });
        }

        private static List<string> GenerateNumbers()
        {
            var numbers = (from p in Enumerable.Range(1, 5)
                           select p.ToString()).ToList();
            return numbers;
        }

        public ActionResult GetMarkers(int id)
        {
            MarkerList markers = GetMarkersObjects(id);
            return Json(markers, JsonRequestBehavior.AllowGet);
        }

        public MarkerList GetMarkersObjects(int id)
        {
            //var deal = _Dealrepository.GetDeal(id);
            DealViewModel viewmodel = _Dealrepository.GetDealDetalhe(id); //new DealViewModel { Negocio = deal, _Parceiro = _ParceiroRepository.GetParceiroById(deal.Id) };
            MarkerList list = new MarkerList();
            list.markers = new List<Marker>();

            foreach (var item in viewmodel.GeoLocais)
            {
                list.markers.Add(new Marker
                {
                    html = "<img src=\"" + viewmodel.Imagem + "\" width=\"50\" height=\"50\" /><br/>" + viewmodel.Descricao,
                    lat = item.Latitude,
                    lng = item.Longitude,
                    label = viewmodel.NomeParceiro
                });
            }
            return list;
        }


        [HttpPost]
        public JsonResult ValidaCodigo(FormCollection model)
        {
            if (model["codDesconto"] != null)
            {
                return Json(new AjaxResult
                {
                    Mensagem = "Código válido!",
                    MsgErro = "success"
                });
            }
            return Json(new AjaxResult
            {
                Mensagem = "Código inválido!",
                MsgErro = "error"
            });
        }

        [Authorize]
        [HttpPost]
        public JsonResult Ofertas(OrderDetailViewModel collection)
        {
            if (ModelState.IsValid)
            {
                var cart = ShoppingCart.GetCart(this.HttpContext);

                if (cart.AddOfertas(collection))
                    return Json(new AjaxResult
                    {
                        Mensagem = "tudo ok",
                        MsgErro = "success"
                    });
                else
                {
                    return Json(new AjaxResult
                    {
                        Mensagem = "Erro",
                        MsgErro = "error"
                    });
                }
            }
            else {
                return Json(new AjaxResult
                {
                    Mensagem = "Erro",
                    MsgErro = "error"
                });
            }
        }

        private class AjaxResult
        {
            public string Mensagem { get; set; }
            public string MsgErro { get; set; }
        }

        [HttpGet]
        public string EnvioNewsletter(string Email)
        {
            try
            {
               return _Dealrepository.EnvioNewsletter(Email);
            }
            catch (Exception)
            {
                return "Erro";
            }
           
        }

    }
}
